3217. Delete Nodes From Linked List Present in Array
難度: 中等
給定一個鏈結串列head
與一整數陣列nums
代表要刪除的值。
若此鏈結串列的節點之值包含在nums
中,則刪除該節點。
如同昨天提到的,這題需要反覆查詢nums
是否存在某值,因此應膝跳反射想到用哈希表來解。
前一個節點
,目前節點
、下一個節點
,來遍歷整個鏈結串列。目前節點
的值
存在於nums
,則將前一個沒被移除的節點
的下一個節點指標
,更改為目前節點
的下一個節點指標
;接著刪除目前節點
目前節點
的值
不存在於nums
,則依序更新三個指標技巧1: 可以創建一個虛設節點
指向鏈結串列的頭,方便我們操作三個指標;最後回傳虛設節點
的下一個節點指標
即為所求之頭。
技巧2: 在leetcode上,刪除的節點要不要delete(CPP)或是free(C)都是可以AC的,有得時候不free掉會比較快。
class Solution
{
public:
ListNode *modifiedList(vector<int> &nums, ListNode *head)
{
unordered_set<int> nums_set;
for (auto num : nums)
nums_set.insert(num);
// Create a dummy head;
ListNode dummy_node = ListNode(0, head);
ListNode *prev_node = &dummy_node;
ListNode *curr_node = head;
ListNode *next_node = nullptr;
while(curr_node)
{
next_node = curr_node->next;
if(nums_set.find(curr_node->val) != nums_set.end())
{
prev_node->next = next_node;
delete curr_node;
curr_node = next_node;
}
else
{
prev_node = curr_node;
curr_node = next_node;
}
}
return dummy_node.next;
}
};
若鏈結串列長度為N,nums
長度為M
時間複雜度: O(M+N);建立長度M的哈希表,遍歷長度N的鏈結串列
空間複雜度: O(M),需要建立長度M的哈希表,三個指標和一個虛設指標來遍歷鏈結串列。
Time | Submitted | Status | Runtime | Memory | Language |
---|---|---|---|---|---|
09/06/2024 | 22:20 | Accepted | 443 ms | 258.5 MB | cpp |
09/06/2024 | 22:20 | Accepted | 446 ms | 262.8 MB | cpp |
582/582 cases passed (443 ms)
Your runtime beats 57.29 % of cpp submissions
Your memory usage beats 71.2 % of cpp submissions (258.5 MB)